package n2227;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {

	
	static int W,H;
	
	static int a[][]=new int[301][301];
	
	static boolean v[][]=new boolean[301][301];
	
	
	static class Node{
		int x,y;
		int cnt;
	}
	
	
	
	static int solve()
	{
		int count=0;
		PriorityQueue<Node> queue=new PriorityQueue<Node>(10,new Comparator<Node>(){
			public int compare(Node o1, Node o2) {
				// TODO Auto-generated method stub
				return o1.cnt-o2.cnt;
			}
		});
		//把四周的点加入堆中
		for(int i=0;i<W;i++)
		{
			Node node=new Node();
			node.x=i;
			node.y=0;
			node.cnt=a[i][0];
			v[i][0]=true;
			queue.add(node);
			node=new Node();
			node.x=i;
			node.y=H-1;
			node.cnt=a[i][H-1];
			v[i][H-1]=true;
			queue.add(node);
		}
		for(int i=1;i<H-1;i++)
		{
			Node node=new Node();
			node.x=0;
			node.y=i;
			node.cnt=a[0][i];
			v[0][i]=true;
			queue.add(node);
			node=new Node();
			node.x=W-1;
			node.y=i;
			node.cnt=a[W-1][i];
			v[W-1][i]=true;
			queue.add(node);
		}
		
		while(!queue.isEmpty())
		{
			Node node=queue.poll();
			//上边
			if(node.x-1>=0&&v[node.x-1][node.y]==false)
			{
				Node p=new Node();
				p.x=node.x-1;
				p.y=node.y;
				p.cnt=a[p.x][p.y];
				if(p.cnt<node.cnt){
					count+=node.cnt-p.cnt;
					p.cnt=node.cnt;
				}
				v[p.x][p.y]=true;
				queue.add(p);
			}
			//左边
			if(node.y-1>=0&&v[node.x][node.y-1]==false)
			{
				Node p=new Node();
				p.x=node.x;
				p.y=node.y-1;
				p.cnt=a[p.x][p.y];
				if(p.cnt<node.cnt){
					count+=node.cnt-p.cnt;
					p.cnt=node.cnt;
				}
				v[p.x][p.y]=true;
				queue.add(p);
			}
			//下边
			
			if(node.x+1<W&&v[node.x+1][node.y]==false)
			{
				Node p=new Node();
				p.x=node.x+1;
				p.y=node.y;
				p.cnt=a[p.x][p.y];
				if(p.cnt<node.cnt)
				{
					count+=node.cnt-p.cnt;
					p.cnt=node.cnt;
				}
				v[p.x][p.y]=true;
				queue.add(p);
			}
			
			//右边
			if(node.y+1<H&&v[node.x][node.y+1]==false)
			{
				Node p=new Node();
				p.x=node.x;
				p.y=node.y+1;
				p.cnt=a[p.x][p.y];
				if(p.cnt<node.cnt)
				{
					count+=node.cnt-p.cnt;
					p.cnt=node.cnt;
				}
				v[p.x][p.y]=true;
				queue.add(p);
			}
			
		}
		
		return count;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {

		BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st=new StringTokenizer(bf.readLine());
		H=Integer.parseInt(st.nextToken());
		W=Integer.parseInt(st.nextToken());
		for(int i=0;i<W;i++)
		{
			st=new StringTokenizer(bf.readLine());
			for(int j=0;j<H;j++)
			{
				a[i][j]=Integer.parseInt(st.nextToken());
			}
		}
		System.out.println(solve());
	}

}
